// Copyright 2019 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "src/torque/ls/json.h"

#include <iostream>
#include <sstream>
#include "src/torque/utils.h"

namespace v8 {
namespace internal {
    namespace torque {
        namespace ls {

            namespace {

                void SerializeToString(std::stringstream& str, const JsonValue& value)
                {
                    switch (value.tag) {
                    case JsonValue::NUMBER:
                        str << value.ToNumber();
                        break;
                    case JsonValue::STRING:
                        str << StringLiteralQuote(value.ToString());
                        break;
                    case JsonValue::IS_NULL:
                        str << "null";
                        break;
                    case JsonValue::BOOL:
                        str << (value.ToBool() ? "true" : "false");
                        break;
                    case JsonValue::OBJECT: {
                        str << "{";
                        size_t i = 0;
                        for (const auto& pair : value.ToObject()) {
                            str << "\"" << pair.first << "\":";
                            SerializeToString(str, pair.second);
                            if (++i < value.ToObject().size())
                                str << ",";
                        }
                        str << "}";
                        break;
                    }
                    case JsonValue::ARRAY: {
                        str << "[";
                        size_t i = 0;
                        for (const auto& element : value.ToArray()) {
                            SerializeToString(str, element);
                            if (++i < value.ToArray().size())
                                str << ",";
                        }
                        str << "]";
                        break;
                    }
                    default:
                        break;
                    }
                }

            } // namespace

            std::string SerializeToString(const JsonValue& value)
            {
                std::stringstream result;
                SerializeToString(result, value);
                return result.str();
            }

        } // namespace ls
    } // namespace torque
} // namespace internal
} // namespace v8
